package com.example.springboot.codengen;

import com.mybatisflex.codegen.Generator;
import com.mybatisflex.codegen.config.GlobalConfig;
import com.zaxxer.hikari.HikariDataSource;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;

/**
 * @author yw
 * @since 2024/4/23
 */
@SpringBootApplication
public class Codegen {

    public static void main(String[] args) {

        ConfigurableApplicationContext context = SpringApplication.run(Codegen.class, args);

        CodegenConfig mainClass = context.getBean(CodegenConfig.class);

        // 配置数据源
        HikariDataSource dataSource = new HikariDataSource();
        // 数据库连接信息
        dataSource.setJdbcUrl(mainClass.jdbcUrl);
        // 用户名
        dataSource.setUsername(mainClass.username);
        // 密码
        dataSource.setPassword(mainClass.password);

        // 创建配置内容，两种风格都可以。
        GlobalConfig globalConfig = createGlobalConfigUseStyle1(mainClass);

        //设置表前缀和只生成哪些表，setGenerateTable 未配置时，生成所有表
        globalConfig.getStrategyConfig().setGenerateTable(mainClass.generateTable);

        // 通过 datasource 和 globalConfig 创建代码生成器
        Generator generator = new Generator(dataSource, globalConfig);

        // 生成代码
        generator.generate();

        // 关闭应用程序上下文
        context.close();
    }

    public static GlobalConfig createGlobalConfigUseStyle1(CodegenConfig mainClass) {
        // 创建配置内容
        GlobalConfig globalConfig = new GlobalConfig();

        // 设置根包
        globalConfig.setBasePackage(mainClass.basePackage);

        // 设置生成 entity 并启用 Lombok
        globalConfig.setEntityGenerateEnable(true);
        globalConfig.setEntityWithLombok(true);

        globalConfig.setAuthor(mainClass.author);

        // 设置生成内容
        globalConfig.setMapperGenerateEnable(true);
        globalConfig.setServiceGenerateEnable(true);
        globalConfig.setControllerGenerateEnable(true);
        globalConfig.setServiceImplGenerateEnable(true);

        return globalConfig;
    }

}